Exercício 11: Leitura com repetição em caso de exceção


O código abaixo, é a classe de leitura que desenvolvemos para auxiliar nos processos de leitura de dados. No entantoa última versão, não realizava a leitura novamente de um valor caso ocorresse uma exceção.

Estude o método lerValorInteiro() para verificar a alteração realizada conforme destacado de verde. Esta modificação criou o seguinte comportamento: quando o usuário vai digitar um valor inteiro que o código está usando o método lerValorInteiro() e ele digita uma string ao invés de um dígito, ocorre uma exceção que é trada pelo Catch. Na versão anterior, o código simplesmente parava e dava a mensagem dizendo que o usuário digitou um valor inválido. Agora nesta versão, utilizamos uma estrutura de repetição do tipo Do While() para ler novamente um novo valor, e isto irá ocorrer até que o usuário digite um valor correto.

Faça agora a mesma implementação para os demais métodos: lerValorFloat(), lerValorDouble(), lerValorShort(), lerValorLong() ...

import java.util.Scanner;

public class Leitura {
    static Scanner teclado = new Scanner(System.in);

    static void limparBuffer() {
        if (teclado.hasNextLine()) {
            teclado.nextLine();
        }
    }

    // ---------- TIPOS NUMÉRICOS ----------

    static int lerValorInteiro(String mensagem) {
        int valor = 0;
        
        // essa variavel ira controlar se houve algum problema na leitura
        // conhecida na programacao como variavel "flag"
        boolean leituraComProblema = true;

        do {
            try {
                System.out.print(mensagem);
                valor = teclado.nextInt();
                
                leituraComProblema = false;

            } catch (Exception e) {
                System.out.println("Valor digitado é incorreto.");
            } finally {
                limparBuffer();
            }

        } while (leituraComProblema);

        return valor;
    }

    static float lerValorFloat(String mensagem) {
        float valor = 0;
        try {
            System.out.print(mensagem);
            valor = teclado.nextFloat();
        } catch (Exception e) {
            System.out.println("Valor digitado é incorreto.");
        } finally {
            limparBuffer();
        }
        return valor;
    }

    static double lerValorDouble(String mensagem) {
        double valor = 0;
        try {
            System.out.print(mensagem);
            valor = teclado.nextDouble();
        } catch (Exception e) {
            System.out.println("Valor digitado é incorreto.");
        } finally {
            limparBuffer();
        }
        return valor;
    }

    static long lerValorLong(String mensagem) {
        long valor = 0;
        try {
            System.out.print(mensagem);
            valor = teclado.nextLong();
        } catch (Exception e) {
            System.out.println("Valor digitado é incorreto.");
        } finally {
            limparBuffer();
        }
        return valor;
    }

    static short lerValorShort(String mensagem) {
        short valor = 0;
        try {
            System.out.print(mensagem);
            valor = teclado.nextShort();
        } catch (Exception e) {
            System.out.println("Valor digitado é incorreto.");
        } finally {
            limparBuffer();
        }
        return valor;
    }

    static byte lerValorByte(String mensagem) {
        byte valor = 0;
        try {
            System.out.print(mensagem);
            valor = teclado.nextByte();
        } catch (Exception e) {
            System.out.println("Valor digitado é incorreto.");
        } finally {
            limparBuffer();
        }
        return valor;
    }

    // ---------- TIPOS TEXTUAIS ----------

    static String lerValorString(String mensagem) {
        String valor = "";
        try {
            System.out.print(mensagem);
            valor = teclado.nextLine();
        } catch (Exception e) {
            System.out.println("Valor digitado é incorreto.");
        }
        return valor;
    }

    static char lerValorChar(String mensagem) {
        char valor = '\0';
        try {
            System.out.print(mensagem);
            String entrada = teclado.nextLine();
            if (entrada.length() > 0) {
                valor = entrada.charAt(0);
            }
        } catch (Exception e) {
            System.out.println("Valor digitado é incorreto.");
        }
        return valor;
    }

    // ---------- TIPOS LÓGICOS ----------

    static boolean lerValorBoolean(String mensagem) {
        boolean valor = false;
        try {
            System.out.print(mensagem);
            valor = teclado.nextBoolean();
        } catch (Exception e) {
            System.out.println("Valor digitado é incorreto. Digite true ou false.");
        } finally {
            limparBuffer();
        }
        return valor;
    }
}


asdf